package week7.ui;

import week7.kaarten.*;

import java.util.*;

public class HandTUI extends TUI {
    static public void main(String[] args) {
        new HandTUI().start();
    }

    /** De hand waarop dit interface werkt. */
    private FlexHand hand = new FlexHand(new RangKleurOrdening());

    public HandTUI() {
        super("Simulatie van een hand kaarten");
        addActie(new Print());
        addActie(new Plus());
        addActie(new Min());
        addActie(new VeranderSorteercriterium());
    }

    /** 
     * Test of een String een kaart-afkorting is.
     * De afkorting dient uit twee tekens te bestaan:
     * 1e teken = kleursymbool, 2e teken = rangsymbool
     * @param tekst te testen String
     * @require <tt>tekst != null</tt>
     * @ensure <tt>result == true</tt> alsla <ul>
     * <li> <tt>tekst.length() == 2</tt>, 
     * <li> <tt>tekst.charAt(0)</tt> is een kleursymbool en 
     * <li> <tt>tekst.charAt(1)</tt> is een rangsymbool </ul>
     */
    boolean isKaart(String tekst) {
		return tekst.length() == 2
			&& Kaart.geldigeKleur(tekst.charAt(0))
			&& Kaart.geldigeRang(tekst.charAt(1));
    }

    /** 
     * Converteert een String naar een Kaart
     * @param tekst afkorting van 2 tekens voor een kaart;
     *              1e teken = kleursymbool, 2e teken = rangsymbool
     * @require <tt>tekst != null, isKaart(tekst)</tt>
     * @ensure <tt>result != null</tt>
     */
    Kaart toKaart(String tekst) {
		return new Kaart(tekst.charAt(0), tekst.charAt(1));
    }

    /** Voegt een kaart aan de hand toe. */
    public class Plus extends Actie {
        private Plus() {
            super('+', 1, "[kaart] voeg nieuwe kaart toe");
        }

        public boolean parsCorrect(List<String> pars) {
            if (isKaart(pars.get(0))) {
                return true;
            } else {
                System.out.println("Parameter "+pars.get(0)+
                                   " is geen correcte kaart");
                return false;
            }
        }

        public void voerUit(List<String> pars) {
            hand.add(toKaart(pars.get(0)));
        }
    }

    /** Voegt een kaart aan de hand toe. */
    public class Min extends Actie {
        private Min() {
            super('-', 1, "[kaart] verwijder een kaart");
        }

        public boolean parsCorrect(List<String> pars) {
            if (isKaart(pars.get(0))) {
                return true;
            } else {
                System.out.println("Parameter "+pars.get(0)+ " is geen correcte kaart");
                return false;
            }
        }

        public void voerUit(List<String> pars) {
            if (!hand.remove(toKaart(pars.get(0)))) {
				System.out.println("Kaart " + pars.get(0) + " zit niet in je hand");
            }
        }
    }

    /** Voegt een kaart aan de hand toe. */
    public class VeranderSorteercriterium extends Actie {
        private VeranderSorteercriterium() {
            super('c', 1, "[criterium] verander het sorteerkriterium van de hand");
        }

        public boolean parsCorrect(List<String> pars) {
            if (pars.get(0).equals("rk") || pars.get(0).equals("kr")) {
                return true;
            } else {
                System.out.println("Parameter " + pars.get(0) + " is geen correct criterium; kies tussen kr of rk");
                return false;
            }
        }

        public void voerUit(List<String> pars) {
            if (pars.get(0).equals("rk")) {
				hand.setOrdening(new RangKleurOrdening());
			} else {
				hand.setOrdening(new KleurRangOrdening());
			}
        }
    }

    public class Print extends Actie {
        private Print() {
            super('p', 0, "laat de hand zien");
        }

        public void voerUit(List<String> pars) {
            System.out.println("Hand:");
            System.out.println(hand);
        }
    }
}
